﻿package general
{
	import Box2D.Dynamics.Joints.b2RevoluteJointDef;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Rectangle;
	import personajes.Jugador;
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import Box2D.Dynamics.*;
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	
	/**
	 * Clase principal
	 * 
	 * @author Adrián Ramis González
	 */
	public class Main extends Sprite 
	{	
		//Declaración del objeto que interactua con el motor Box2D
		public var mundo:b2World; 
		
		//Otras variables
		public var cuerpo:b2Body;
		public var jugador:Jugador;
		
		//Vector para aplicar movimiento
		public var direccion:b2Vec2;
		
		//Objeto teclado con el que interactuamos
		public var teclado:Teclas;
		
		//Constante para tratar mejor los tamaños de box2d
		public const PIXELS_POR_METRO:int = 30;
		
		//Variables para los objetos
		public var bodyDef:b2BodyDef;
		public var boxDef:b2PolygonDef;
		
		/**
		 * Metodo principal
		 */
		public function Main():void 
		{	
			inicializacion();

			//Listener para los frames
			stage.addEventListener(Event.ENTER_FRAME, frame_entrante);
		}
		
		/**
		 * Metodo que se ejecuta en cada frame y que va a refrescar el juego
		 * 
		 * @param	event
		 */
		public function frame_entrante(event:Event):void
		{
			mundo.Step(1/30, 10); //30fps
			cuerpo.WakeUp();
		}
		
		/**
		 * Metodo que crea una porcion del mapa
		 * 
		 * @param	px		posicion en el eje x
		 * @param	py		posicion en el eje y
		 * @param	w		anchura
		 * @param	h		altura
		 */
		public function crearTerreno(px:int, py:int, w:int, h:int):void 
		{
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(px/PIXELS_POR_METRO, py/PIXELS_POR_METRO);
			boxDef = new b2PolygonDef();
			boxDef.SetAsBox(w/PIXELS_POR_METRO, h/PIXELS_POR_METRO);
			boxDef.friction=0.3;
			boxDef.density=0;	//Con la densidad a 0 significa que no le afecta la gravedad
			cuerpo=mundo.CreateBody(bodyDef);
			cuerpo.CreateShape(boxDef);
			cuerpo.SetMassFromShapes();
		}
		
		/**
		 * Metodo que inicializa el entorno
		 */
		public function inicializacion():void 
		{
			//Inicializamos el entorno físico
			var entorno:b2AABB = new b2AABB(); //Marco donde se aplica el motor fisico
			entorno.lowerBound.Set(-1500.0/PIXELS_POR_METRO, -1500.0/PIXELS_POR_METRO); //Esquina inferior del marco
			entorno.upperBound.Set(1500.0/PIXELS_POR_METRO, 1500.0/PIXELS_POR_METRO); //Esquina superior del marco
			var gravedad:b2Vec2=new b2Vec2(0.0,10.0); //Variable para la gravedad (gravedad horizontal, gravedad vertical)
			mundo=new b2World(entorno,gravedad,true); //Inciamos el mundo con tres parametros (entorno, gravedad, booleano?)
			
			//Inicializamos el manejador del teclado
			var keyboard_sprite:MovieClip = new MovieClip();
			addChild(keyboard_sprite);
			teclado = new Teclas(keyboard_sprite);		
			
			//Inicializamos el debug
			var debug_draw:b2DebugDraw = new b2DebugDraw();
			var debug_sprite:Sprite = new Sprite();
			addChild(debug_sprite);
			debug_draw.m_sprite=debug_sprite;
			debug_draw.m_drawScale = 30; //Tamaño de escala del dibujo
			debug_draw.m_alpha = 1;
			debug_draw.m_fillAlpha=0.9; //Transparencia del interior
			debug_draw.m_lineThickness=1; //Grosor del borde
			debug_draw.m_drawFlags=b2DebugDraw.e_shapeBit;
			mundo.SetDebugDraw(debug_draw);
			
			//Creamos la pared de la izquierda
			crearTerreno(0, 0, 10, 800);
			
			//Creamos la pared de la derecha
			crearTerreno(600,0,10,800);
			
			//Creamos el jugador
			jugador = new Jugador(teclado, cuerpo, mundo);
		}

	}
	
}